# python函数参数：必选参数、默认参数、可变参数、关键字参数、命名关键字参数
#!/usr/bin/python
# -*- coding=utf-8 -*-
# 1、必选参数：必须参数是最基本的参数类型，当你在 Python 函数中定义一个必选参数时，每次调用都必须给予赋值，否则将报错。
def fun(a):
    print("必选参数：a =", a)


fun("felord.cn")

# 2、默认参数：拥有一个默认值的参数，定义默认参数要牢记一点：默认参数必须指向不变对象


def fun(b='felord.cn'):
    print("默认参数：b =", b)


fun()

# 3、可变参数：前缀标识 * 来声明该参数是一个可变参数，通常记作 *args ,你也可以记作 *params 。args 会把所有的参数收纳成一个 tuple。


def sum(*args):
    total = 0
    for i in args:
        total += i
    return total


print("可变参数：total =", sum(1, 4, 6, 8, 12, 16))
# 4、关键字参数：关键字参数也是实现任意个数参数的一种方式，区别在于可变参数收纳为一个 tuple 而关键字参数将我们传入参数的参数名和对应的值收纳为一个dict （字典）。通常记作 **kwargs 以区别于可变参数,实际上 kw 就是 keyword的缩写。


def mapper(**kwargs):
    print('关键字参数：', kwargs)


mapper()
mapper(name="felord.cn")

# 5、命名关键字参数：限定关键字形参，在 *, 之后紧跟的连续的非可变参数和非关键字参数就是命名关键字参数
# 如：def func(name,*,kw1,kw2),其中name为其他参数，命名关键字参数只接收kw1,kw2作为关键字参数
# 和关键字参数**kw不同，命名关键字参数需要一个特殊分隔符 *，*后面的参数被视为命名关键字参数。
# 如果函数定义中已经有了一个可变参数，后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
# 命名关键字参数必须传入参数名


def fun(name, age, *, city, job):
    print("命名关键字参数：", name, age, city, job)


fun('Daniel', 18, city='JS', job='Teacher')


def fun(name, age, *city, job):
    print("命名关键字参数：", name, age, city, job)


fun('Daniel', 18, 'JS', 'JX', job='Teacher')
